/******************************************************************************
 * Copyright (C) 2012 ShenZhen ComTop Information Technology Co.,Ltd
 * All Rights Reserved.
 * 本软件为深圳康拓普开发研制。未经本公司正式书面同意，其他任何个人、团体不得使用、
 * 复制、修改或发布本软件.
 *****************************************************************************/

package com.code.common.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;

/**
 * ZLIB压缩工具类
 *
 * @author  陈大周
 * @since   1.0
 * @version 2012-12-11 陈大周
 */
public abstract class ZLibUtils {
    
    /**
     * 压缩
     * 
     * @param data 待压缩数据
     * @return byte[] 压缩后的数据
     */
    public static byte[] compress(byte[] data) {
        byte[] output = new byte[0];
        
        Deflater compresser = new Deflater();
        
        compresser.reset();
        compresser.setInput(data);
        compresser.finish();
        ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);
        try {
            byte[] buf = new byte[1024];
            while (!compresser.finished()) {
                int i = compresser.deflate(buf);
                bos.write(buf, 0, i);
            }
            output = bos.toByteArray();
        } catch (Exception e) {
            output = data;
        } finally {
            try {
                bos.close();
            } catch (IOException e) {
            }
        }
        compresser.end();
        return output;
    }
    
    /**
     * 压缩
     * 
     * @param data 待压缩数据
     * @param os 输出流
     */
    public static void compress(byte[] data, OutputStream os) {
        DeflaterOutputStream dos = new DeflaterOutputStream(os);
        
        try {
            dos.write(data, 0, data.length);
            
            dos.finish();
            
            dos.flush();
        } catch (IOException e) {
        }
    }
    
    /**
     * 解压缩
     * 
     * @param data 待压缩的数据
     * @return byte[] 解压缩后的数据
     */
    public static byte[] decompress(byte[] data) {
        byte[] output = new byte[0];
        
        Inflater decompresser = new Inflater();
        decompresser.reset();
        decompresser.setInput(data);
        
        ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);
        try {
            byte[] buf = new byte[1024];
            while (!decompresser.finished()) {
                int i = decompresser.inflate(buf);
                o.write(buf, 0, i);
            }
            output = o.toByteArray();
        } catch (Exception e) {
            output = data;
        } finally {
            try {
                o.close();
            } catch (IOException e) {
            }
        }
        
        decompresser.end();
        return output;
    }
    
    /**
     * 解压缩
     * 
     * @param is 输入流
     * @return byte[] 解压缩后的数据
     */
    public static byte[] decompress(InputStream is) {
        InflaterInputStream iis = new InflaterInputStream(is);
        ByteArrayOutputStream o = new ByteArrayOutputStream(1024);
        try {
            int i = 1024;
            byte[] buf = new byte[i];
            
            while ((i = iis.read(buf, 0, i)) > 0) {
                o.write(buf, 0, i);
            }
            
        } catch (IOException e) {
        }
        return o.toByteArray();
    }
}